class Particle extends AcGameObject {
    // 构造函数，初始化粒子对象
    constructor(playground, x, y, radius, vx, vy, color, speed, move_length) {
        super(); // 调用父类的构造函数
        this.playground = playground; // 游戏场地对象
        this.ctx = this.playground.game_map.ctx; // 获取绘图上下文
        this.x = x; // 粒子的x坐标
        this.y = y; // 粒子的y坐标
        this.radius = radius; // 粒子的半径
        this.vx = vx; // 粒子在x轴上的速度分量
        this.vy = vy; // 粒子在y轴上的速度分量
        this.color = color; // 粒子的颜色
        this.speed = speed; // 粒子的初始速度（用于衰减）
        this.move_length = move_length; // 粒子移动的总长度
        this.friction = 0.9; // 摩擦系数，用于衰减速度
        this.eps = 0.01; // 一个非常小的数，用于判断接近零的值
    }

    // 开始方法，可以在这里进行初始化操作
    start() {
    }

    // 更新方法，每一帧都会调用此方法
    update() {
        // 如果移动长度或速度小于一个非常小的数（eps），则销毁粒子
        if (this.move_length < this.eps || this.speed < this.eps) {
            this.destroy(); // 调用父类的destroy方法销毁对象
            return false; // 表示此粒子不再需要更新
        }

        // 计算实际移动的距离，取移动长度和当前速度允许的最大移动距离中的较小值
        let moved = Math.min(this.move_length, this.speed * this.timedelta / 1000);
        // 更新粒子的坐标
        this.x += this.vx * moved;
        this.y += this.vy * moved;
        // 衰减速度
        this.speed *= this.friction;
        // 减少剩余移动长度
        this.move_length -= moved;
        // 渲染粒子
        this.render();
    }

    // 渲染方法，用于绘制粒子
    render() {
        let scale = this.playground.scale;
        // 开始绘制路径
        this.ctx.beginPath();
        // 绘制一个圆形，表示粒子，乘一个scale保证在resize时是相对大小
        this.ctx.arc(this.x * scale, this.y * scale, this.radius * scale, 0, Math.PI * 2, false);
        // 设置填充颜色
        this.ctx.fillStyle = this.color;
        // 填充圆形
        this.ctx.fill();
    }
}
